package javase.ch02.created;


/**
 * @Desc TODO
 * @Author chenmin
 * @Date 2025/10/29
 *
 * 创建线程的方式
 *
 * 方式一  extends Thread 类
 * 1.如何创建线程
 *     自定义类，继承Thread类；重写run()指定执行的任务
 *     new Thread()创建线程，并调用start()真正启动线程
 *
 * 2.优势
 *   代码简洁，直接 new Thread()进行创建，并调用start() 启动线程
 *
 * 3.劣势
 *   Java中类与类之间是单继承，一旦继承Thread类之后，无法再继承其他类，拓展性不好
 *
 * 4.注意
 *   不可以重复启动同一个线程，会抛出IllegalThreadStateException异常
 *
 */
public class ThreadDemo {

    //main 主线程
    public static void main(String[] args) {
        //main 主线程在执行任务
        //new MyThread("T1").run();
        //start()正执行任务，所以是T2副线程在执行任务
        //new MyThread("T2").start();

        /**
         * 抢占式调度
         *    优先让优先级高的线程使用 CPU，如果线程的优先级相同，那么会随机选择一个(线程随机性)，Java使用的为抢占式调度。
         *    - 多线程并发执行任务时，本身根据抢占式调度，所以结果会出现随机性
         *    - 谁获得CPU的执行权，谁就先执行，至于执行多久，由获得“时间片”决定
         */
        //副线程执行任务
        MyThread t1 = new MyThread("线程_1");
        t1.start();
        //重复启动t1  抛出IllegalThreadStateException异常
        //t1.start();

        //主线程main执行任务
        /*for (int i = 0; i < 5; i++) {
            //Thread[main,5,main] --- 1   [当前线程名,线程优先级,线程组]
            System.out.println(Thread.currentThread()+" --- "+(i+1));
        }*/
    }

}
class MyThread extends Thread{

    public MyThread(String name){
        super(name);
    }

    //定义任务
    @Override
    public void run() {
        //System.out.println(Thread.currentThread().getName()+" is running ...");

        for (int i = 0; i < 5; i++) {
            //Thread[线程_1,5,main] --- 1   [当前线程名,线程优先级,线程组]
            System.out.println(Thread.currentThread()+" --- "+(i+1));
        }
    }
}
